﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIIE_ERP.Codigo;

namespace SIIE_ERP.BaseDatos.Bancos.Transacciones
{
    public class dbo_Pago_Clientes
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion

        #region Constructores

        public dbo_Pago_Clientes(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion

        #region UPDATE

        public Respuesta Update_Pagos_A_Clientes(Int32 Secuencia, double Monto)
        {
            string Query = @"UPDATE dbo_Trans_Pago_Cliente SET Pendiente_por_Aplicar = Pendiente_por_Aplicar @@Operador @@Monto WHERE 
                             RFC = '@@RFC' AND Secuencia = @@Secuencia";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Secuencia", ((Int32)Secuencia).ToString());
            Query = Query.Replace("@@Operador", Monto > 0.0 ? "-": "+");
            Query = Query.Replace("@@Monto", Math.Abs(Monto).ToString());
            return SrvDB.ExecuteQuery_Update(Query);
        }

        public Respuesta Update_Pagos_A_Clientes_Zero(Int32 Secuencia)
        {
            string Query = @"UPDATE dbo_Trans_Pago_Cliente SET Pendiente_por_Aplicar = 0 WHERE 
                             RFC = '@@RFC' AND Secuencia = @@Secuencia";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Secuencia", ((Int32)Secuencia).ToString());
            return SrvDB.ExecuteQuery_Update(Query);
        }


        #endregion

        #region SELECT
        
        public DataTable Get_Report(int Id_CuentaBancaria, int Estatus, int Id_FormaPago, int Tiempo, int Id_Cliente)
        {
            string Query = @"

                SELECT        

	                a.Id_Pago, 
	                a.Secuencia, 
	                a.RFC, 
	                a.Id_Cliente, 
	                b.EsFactura, 
	                c.RFC_Cliente, 
	                c.Razon_Social, 
	                c.Nombre_Comercial,
	                c.Calle, 
	                c.Num_Ext, 
	                c.Num_Int, 
	                c.Colonia, 
	                c.CP, 
	                Estado_Cliente.Nombre AS Estado, 
	                c.Municipio, 
	                Pais_Cliente.Nombre AS Pais, 
	
	                c.Calle + ' ' + c.Num_Ext + ' ' + 
	                Switch(
		                c.Num_Int   IS NULL, ', COL. ',
		                true, c.Num_Int + ', COL. '
                    )	
	
	                + c.Colonia + ', C.P. ' + c.CP + ', ' + c.Municipio + ', ' + Estado_Cliente.Nombre AS Direccion_Cliente, 
	
	                d.Id_GrupoClientes, 
	                d.Nombre AS Grupo_Cliente, 
	                YEAR(a.Fecha_Pago)  AS Anio,	
	                MONTH(a.Fecha_Pago) AS Mes_Id, 
	
	                Cstr(YEAR(a.Fecha_Pago))  + '-' + 
      
                    Switch(
		                MONTH(a.Fecha_Pago) < 10, '0' + Cstr(MONTH(a.Fecha_Pago)),
		                true, Cstr(MONTH(a.Fecha_Pago))
                    ) AS Mes,

	                a.Fecha_Pago, 
	                a.Importe * k.TipoCambio AS Importe_Pesos, 
	                a.Importe AS Importe_Moneda_Fact, 
	                a.Pendiente_por_Aplicar, 
	                o.Clave AS Clave_Moneda, 
	                o.Simbolo AS Simbolo_Moneda, 
	                o.Nombre AS Moneda, 
	
	                Switch(
		                b.EsFactura = 0, b2.Secuencia,
		                true, b1.Secuencia
                    ) AS Secuencia_Doc,

	                Switch(
		                b.EsFactura = 0, b2.Fecha_Documento,
		                true, b2.Fecha_Documento
                    ) AS Fecha_Doc,

	                Switch(
		                b.EsFactura = 0, b2.Fecha_Vencimiento,
		                true, b1.Fecha_Vencimiento
                    ) AS Expr1,

	                Switch(
		                b.EsFactura = 0,  b2.Saldo,
		                true, b1.Saldo
                    ) AS Expr2,
	
	                b.Importe AS Importe_Asignado, 
	                a.Estatus, 
	                p.Nombre AS Estatus_Desc, 
	                a.Concepto, 
	                a.Referencia, 
	                a.Id_Cuenta, 
	                q.Nombre AS Cuenta_Bancaria, 
	                a.Id_Forma_Pago, 
	                r.Nombre AS Forma_Pago

                FROM 

                ((((((((((((	dbo_Trans_Pago_Cliente AS a 
	                LEFT OUTER JOIN dbo_Trans_Aplicacion_Pago_Clientes AS b ON a.Id_Pago = b.Id_Pago )
	                LEFT OUTER JOIN dbo_Trans_Factura_Cliente_Cab AS b1 ON b.Id_Doc = b1.Id_Factura_Cliente )
	                LEFT OUTER JOIN dbo_Trans_Remision_Cab AS b2 ON b.Id_Doc = b2.Id_Remision )
	                INNER JOIN dbo_Cat_Cliente AS c ON a.Id_Cliente = c.Id_Cliente )
	                INNER JOIN dbo_Cat_Grupo_Clientes AS d ON c.Id_GrupoClientes = d.Id_GrupoClientes )
	                INNER JOIN dbo_Cat_TipoCambio AS k ON a.Id_Moneda = k.Id_Moneda )
	                INNER JOIN dbo_Cat_Moneda AS o ON a.Id_Moneda = o.Id_Moneda )
	                INNER JOIN dbo_Cat_Estatus AS p ON a.Estatus = p.Estatus )
	                INNER JOIN dbo_Cat_Cuenta_Bancaria AS q ON a.Id_Cuenta = q.Id_Cuenta )
	                INNER JOIN dbo_Cat_Forma_Pago AS r ON a.Id_Forma_Pago = r.Id_Forma_Pago )
                    INNER JOIN dbo_Cat_SIIE_Pais AS Pais_Cliente ON Pais_Cliente.Id_SIIE_Pais = c.Id_Pais)
                    INNER JOIN dbo_Cat_SIIE_Estado AS Estado_Cliente ON Estado_Cliente.Id_SIIE_Estado = c.Id_Estado)

                WHERE 

                    a.RFC = '@@RFC'
                AND (@@Id_CuentaBancaria = -1 OR a.Id_Cuenta = @@Id_CuentaBancaria)
                AND (@@Estatus = -1 OR a.Estatus = @@Estatus)
                AND (@@Id_FormaPago = -1 OR a.Id_Forma_Pago = @@Id_FormaPago)
                AND (@@Id_Cliente = -1 OR a.Id_Cliente = @@Id_Cliente)

                AND 
				(
				(@@Tiempo = 1 and Year(a.Fecha_Pago) = Year(NOW()) and Month(a.Fecha_Pago) = Month(NOW())) or
				(@@Tiempo = 2 and Year(a.Fecha_Pago) = Year(DateAdd('m',-1,NOW())) and Month(a.Fecha_Pago) = Month(DateAdd('m',-1,NOW()))) or
				(@@Tiempo = 3 and Year(a.Fecha_Pago) = Year(NOW())) or
				(@@Tiempo = 4 and Year(a.Fecha_Pago) = Year(DateAdd('yyyy',-1,NOW()))) or
				(@@Tiempo = 5)
				)

            ";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Id_CuentaBancaria", Id_CuentaBancaria.ToString());
            Query = Query.Replace("@@Estatus", Estatus.ToString());
            Query = Query.Replace("@@Id_FormaPago", Id_FormaPago.ToString());
            Query = Query.Replace("@@Tiempo", Tiempo.ToString());
            Query = Query.Replace("@@Id_Cliente", Id_Cliente.ToString());
            
            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Pagos_A_Clientes_Lineas(string Pago)
        {
            string Query = @"SELECT 
                                A1.*
                            FROM (
                                dbo_Trans_Aplicacion_Pago_Clientes AS A1
                            )
                            WHERE Id_Pago = @@IdPago";
            
            Query = Query.Replace("@@IdPago", Pago);
            
            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Pagos_A_Clientes()
        {
            string Query = @"SELECT A1.*,
                                    A2.Nombre_Comercial as Desc_Cliente,
                                    A3.Nombre as Desc_Cuenta,
                                    A4.Clave as Desc_Moneda
                            FROM (((
                                dbo_Trans_Pago_Cliente as A1 
                                    INNER JOIN dbo_Cat_Cliente as A2 ON A1.Id_Cliente =A2.Id_Cliente ) 
                                    INNER JOIN dbo_Cat_Cuenta_Bancaria as A3 ON A1.Id_Cuenta = A3.Id_Cuenta)    
                                    INNER JOIN dbo_Cat_Moneda as A4 ON A1.Id_Moneda = A4.Id_Moneda)
                            WHERE A1.RFC = '@@RFC' ORDER BY A1.Id_Pago DESC";
            Query = Query.Replace("@@RFC", this._RFC);

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Pago_A_Cliente_Por_Secuencia(Int32 Secuencia)
        {
            string Query = @"SELECT A1.*,
                                    A2.Nombre_Comercial as Desc_Cliente,
                                    A3.Nombre as Desc_Cuenta,
                                    A4.Nombre as Desc_Moneda,
                                    A5.Nombre as Desc_Forma_Pago
                            FROM ((((
                                dbo_Trans_Pago_Cliente as A1 
                                    INNER JOIN dbo_Cat_Cliente as A2 ON A1.Id_Cliente =A2.Id_Cliente ) 
                                    INNER JOIN dbo_Cat_Cuenta_Bancaria as A3 ON A1.Id_Cuenta = A3.Id_Cuenta)    
                                    INNER JOIN dbo_Cat_Moneda as A4 ON A1.Id_Moneda = A4.Id_Moneda)
                                    INNER JOIN dbo_Cat_Forma_Pago as A5 ON A1.Id_Forma_Pago = A5.Id_Forma_Pago)
                            WHERE A1.RFC = '@@RFC' AND A1.Secuencia = @@Secuencia";
            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Secuencia", ((Int32)Secuencia).ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        #endregion

        #region INSERT

        public Respuesta Insert_Pago_Clientes_Linea(
            string IdPago,
            string IdDocumento,
            Documentos_Id IdTipoDocumento,
            bool EsFactura,
            string Importe,
            string IdMoneda
        )
        {
            string Query = @"INSERT INTO dbo_Trans_Aplicacion_Pago_Clientes(
                                    Id_Aplicacion,
                                    Id_Pago,
                                    Id_Doc, 
                                    Id_TipoDocumento,
                                    EsFactura,
                                    Importe,
                                    Id_Moneda,
                                    Fecha_Alta,
                                    Usuario_Alta,
                                    Fecha_Mantto,   
                                    Usuario_Mantto)
                             VALUES (
                                    IIF(DCount('*', 'dbo_Trans_Aplicacion_Pago_Clientes') = 0, 1, DMax('Id_Aplicacion', 'dbo_Trans_Aplicacion_Pago_Clientes') + 1),
                                    @@IdPago,
                                    @@IdDocumento,
                                    @@IdTipoDocumento,
                                    @@EsFactura,
                                    @@Importe,
                                    @@IdMoneda,
                                    NOW(),
                                    '@@UsuarioActual',
                                    NOW(),
                                    '@@UsuarioActual'
                            )";

            Query = Query.Replace("@@IdPago", IdPago);
            Query = Query.Replace("@@IdDocumento", IdDocumento);
            Query = Query.Replace("@@IdTipoDocumento", IdTipoDocumento.GetHashCode().ToString());
            Query = Query.Replace("@@EsFactura", EsFactura ? "1" : "0");
            Query = Query.Replace("@@Importe", Importe);
            Query = Query.Replace("@@IdMoneda", IdMoneda);
            Query = Query.Replace("@@UsuarioActual", this._Usuario);

            return SrvDB.ExecuteQuery_Insert(Query);
        }

        public Respuesta Insert_Pago_Cliente_Cab(
            string Cliente,
            DateTime FechaPago,
            string FormaPago,
            string CuentaBancaria,
            string Concepto,
            string Referencia,
            string Moneda,
            string Importe,
            string Ingreso
        )
        {
            try
            {
                string Query = @"INSERT INTO dbo_Trans_Pago_Cliente
                                (
                                    Id_Pago,
                                    RFC,
                                    Secuencia,
                                    Estatus,
                                    Id_Cliente,
                                    Fecha_Pago,
                                    Id_Cuenta,
                                    Id_Forma_Pago,
                                    Concepto,
                                    Referencia,
                                    Id_Moneda,
                                    Importe,
                                    Pendiente_Por_Aplicar,
                                    EsIngreso,
                                    Fecha_Alta,
                                    Usuario_Alta,
                                    Fecha_Mantto,
                                    Usuario_Mantto
                                )
                                VALUES
                                (
                                    IIF(DCount('*', 'dbo_Trans_Pago_Cliente') = 0, 1, DMax('Id_Pago', 'dbo_Trans_Pago_Cliente') + 1),
                                    '@@RFC',
                                    IIF(DCount('*', 'dbo_Trans_Pago_Cliente', ""RFC = '@@RFC'"") = 0, 1, DMax('Id_Pago', 'dbo_Trans_Pago_Cliente', ""RFC = '@@RFC'"") + 1),
                                    @@Estatus,
                                    
                                    @@IdCliente,
                                    '@@Fecha',                                
                                    @@IdCuenta,
                                    @@IdFormaPago,
                                    '@@Concepto',
                                    '@@Referencia',
                                    @@IdMoneda,
                                    @@Importe,
                                    @@Importe,
                                    @@EsIngreso,
                                    
                                    NOW(),
                                    '@@Usuario_Alta',
                                    NOW(),
                                    '@@Usuario_Mantto'
                                )";


                Query = Query.Replace("@@RFC", this._RFC);
                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);


                Query = Query.Replace("@@Estatus", SIIE_ERP.BaseDatos.EstatusDocs_Id.Estatus_Doc_Cargado.GetHashCode().ToString());

                Query = Query.Replace("@@IdCliente", Cliente);
                Query = Query.Replace("@@Fecha", FechaPago.ToString());
                Query = Query.Replace("@@IdCuenta", CuentaBancaria);

                Query = Query.Replace("@@IdFormaPago", FormaPago);
                Query = Query.Replace("@@Concepto", Concepto);
                Query = Query.Replace("@@Referencia", Referencia);
                Query = Query.Replace("@@IdMoneda", Moneda);
                Query = Query.Replace("@@Importe", Importe);

                Query = Query.Replace("@@EsIngreso", Ingreso.Equals("Ingreso") ? "1" : "0");

                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        #endregion


    }
}
